#ifndef LIRENOMABSTRAIT_H
#define LIRENOMABSTRAIT_H 1

#include "ADDObjetBase.h"

#include <iostream>
#include <string>
#include <vector>

// pour unary_function
#include <functional>

//#include "debugstreams.h"

/**
 * Foncteur permettant de retrouver le nom d'une compétence ou d'une
 * capacité à partir du conteneur de compétentes d'une classe ou de
 * celui des capacités d'une race.
 *
 * Le but est de l'utiliser pour obtenir le nom d'une compétence,
 * capacité, d'un ensemble racial ou encore d'un ensemble de
 * compétences. La classe / structure doit simplement hériter de
 * ADDObjetBase.
 *
 * Est utilisé en confonction avec un \c transform, pour obtenir un
 * conteneur de noms à partir d'un conteneur d'indices.
 *
 * @author Johan "Solo" Luisier
 */
template< typename T >
class LireNomAbstrait : public ADDObjetBase, 
  std::unary_function< unsigned, std::string >
{
 public:
  LireNomAbstrait( const std::vector< T >* ls = 0 )
    : ADDObjetBase( "LireNomAbstrait" ), liste( ls )
    {};
  ~LireNomAbstrait(){};
  const std::string& operator()( const unsigned& i ) const
    {
      if ( liste == 0 )
	{
	  warning() << "LireNomAbstrait::liste non initialisé" << endmsg;
	  return typeObjet();
	}
      else if ( i >= liste -> size() )
	{
	  warning() << "LireNomAbsrait : tentative d'accéder au champ "
		    << i << " alors que la taille de liste est "
		    << liste -> size() << endmsg;
	}

      debug() << liste -> at( i ) << endmsg;

      return liste -> at( i ) . nom();
    };
  void setAbstrait( const std::vector< T >* ls )
  {
    liste = ls;
  };
 private:
  /**
   * Pointeur sur le conteneur des compétences / capacités.
   */
  const std::vector< T > *liste;
};

#endif // LIRENOMABSTRAIT_H
